package com.bsj.media.media.packageFlv;

import com.bsj.media.media.ParserVideoData;
import com.bsj.media.media.mediaStream;
import com.bsj.power.common.util.ExceptionUtil;
import lombok.extern.slf4j.Slf4j;

import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;

/**
 * @Description flv流
 * @Date 2022/10/25 14:09
 **/
@Slf4j
public class FlvStream extends mediaStream {

    /**
     * 模板模式，用于进行音视频、音频、视频的不同flv打包
     */
    public FlvTypeHandler typeHandler;

    /**
//     * 保存打包后的数据
//     *
//     * @param null:
//     * @return
//     **/
//    FileOutputStream flvOutput = null;

    public FlvStream(String videoType, String uri, int codeType, int protocolType) {
        super.setVideoType(videoType);
//        typeHandler = FlvTypeHandlerFactory(getVideoType(), new CacheParams(uri, codeType, protocolType));
        typeHandler = FlvTypeHandlerFactory.flvTypeHandlerFactory(getVideoType(), new CacheParams(uri, codeType, protocolType));
//        writeFileInit(uri);
    }

//    /**
//     * 写入文件初始化
//     * @param uri:
//     * @return
//     **/
//    private void writeFileInit(String uri) {
//        String printTerminalNo = LoggerPrintUtil.getFlvWriteFileTerminalNo();
//        if (StringUtils.isNotBlank(printTerminalNo) && uri.contains(printTerminalNo)) {
//            String fileName = uri.substring(1) + ".flv";
//            try {
//                flvOutput = new FileOutputStream(fileName);
//                log.info("初始化保存流媒体文件, fileName=" + fileName);
//            } catch (Exception e) {
//                log.error("初始化文件失败: fileName=" + fileName + ", e:" + ExceptionUtil.getStackStr(e));
//            }
//        }
//    }

    @Override
    public int PacketData(byte[] fd, int offset, int len, byte[] dstBuffer) {
        ByteBuffer dst = ByteBuffer.wrap(dstBuffer); // 该对象来操作dstBuffer
        // 提取FDFD协议数据的数据体，19字节+body+校验1+结束位1
        byte[] body = super.getData(fd);

        if (typeHandler.isPacketFlvHeader) {
            // 可以打包flv Header + TagSize[0] + ScriptTag + 音视频第一个的Tag
            typeHandler.firstPackageFlv(body, dst);
            if (dst.position() != 0) {
                typeHandler.isPacketFlvHeader = false;
            } else {
                // 开始打包失败
                if (typeHandler.mediaToVideoPacket) {
                    log.error("打包失败！");
//                    typeHandler = FlvTypeHandlerFactory.flvTypeHandlerFactory(2, typeHandler.);
                }
                return 0;
            }
        }

        // 打包音视频
        if (typeHandler.packVideoFlag() && ParserVideoData.getTypeFrame(body) == 1) {
            this.videoFrameNum++; // 视频帧数+1
            typeHandler.packVideo(body, dst);
        } else if (typeHandler.packAudioFlag() && ParserVideoData.getTypeFrame(body) == 0) {
            typeHandler.packAudio(body, dst);
        }
        // 看是否需要写入到文件
        int ret = dst.position();
        if(ret > 0){
            log.error("有问题");
        }
//        if (ret > 0 && flvOutput != null) {
//            // 写入文件
//            try {
//                flvOutput.write(dstBuffer, 0, ret);
//            } catch (Exception e) {
//                log.error("写入文件异常, ret=" + ret + ",e:" + ExceptionUtil.getStackStr(e));
//            }
//        }
        return ret;
    }

    @Override
    public void setClosed(boolean isClosed) {
        super.setClosed(isClosed);
        if (isClosed) {
//            if (flvOutput != null) {
//                try {
//                    flvOutput.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
            if (typeHandler.aacHandlerUtil != null) {
                typeHandler.aacHandlerUtil.release();
            }
        }
    }
}
